﻿using System.Web;
using DoNet.Helper;

namespace DoNet.Platform.WeiBo
{
    /// <summary>
    /// 新浪微博 Access Token
    /// </summary>
    public class TokenApi
    {
        /// <summary>
        /// 获取Access Token
        /// </summary>
        /// <param name="client_id">第三方应用在微博开放平台注册的APPKEY。</param>
        /// <param name="client_secret">在微博开放平台注册的应用所对应的AppSecret。</param>
        /// <param name="code">调用第一步 authorize 接口所获得的授权 code。 </param>
        /// <param name="redirect_uri">授权回调地址，传的值需与在开放平台网站填写的回调地址一致，设置填写位置：“我的应用>应用信息>高级信息”。 </param>
        /// <returns></returns>
        public static ReturnData GetToken(string client_id, string client_secret, string code, string redirect_uri)
        {
            string param = JsonHelper.SerializeObject(new
            {
                grant_type = "authorization_code",
                client_id = client_id,
                client_secret = client_secret,
                code = code,
                redirect_uri = redirect_uri
            });
            string reqUrl = CommonConfig.WebApiUrl_WeiBo + "/oauth2/access_token";
            var result = HttpHelper.HttpPost(reqUrl, param);

            if (result.success)
            {
                var obj = JsonHelper.DeserializeObject<dynamic>(result.data);
                if (obj != null)
                {
                    /*
                    {
                        "error":"HTTP METHOD is not suported for this request!",
                        "error_code":10021,
                        "request":"/oauth2/access_token",
                        "error_uri":"/oauth2/access_token"
                    } 
                    */
                    if (obj.error_code != null)
                    {
                        return new ReturnData()
                        {
                            success = false,
                            message = obj.error,
                            data = result.data
                        };
                    }
                    else
                    {
                        return result;
                    }
                }
                else
                {
                    return result;
                }
            }
            else
            {
                return result;
            }
        }

        /// <summary>
        /// 获取授权URL
        /// https://open.weibo.com/wiki/index.php?title=Oauth2/authorize&oldid=16302
        /// </summary>
        /// <param name="client_id">申请应用时分配的AppKey。</param>
        /// <param name="redirect_uri">授权回调地址，传的值需与自己在开放平台网站填写的回调地址一致，设置填写位置：“我的应用>应用信息>高级信息”。</param>
        /// <param name="state">用于保持请求和回调的状态，在回调时，会在Query Parameter中回传该参数。开发者可以用这个参数验证请求有效性，也可以记录用户请求授权页前的位置。这个参数可用于防止跨站请求伪造（CSRF）攻击</param>
        /// <param name="scope">申请scope权限所需参数，可一次申请多个scope权限，用逗号分隔。使用文档</param>
        /// <param name="display">授权页面的终端类型，取值见下面的说明。</param>
        /// <param name="forcelogin">是否强制用户重新登录，true：是，false：否。默认false。</param>
        /// <param name="language">授权页语言，缺省为中文简体版，en为英文版。英文版测试中，开发者任何意见可反馈至 @微博API</param>
        /// <returns></returns>
        public static string GetAuthorizeUrl(string client_id, string redirect_uri, string state = "", string scope = "", string display = "", bool forcelogin = false, string language = "")
        {
            /*
            OAuth2的authorize接口

            URL
            https://api.weibo.com/oauth2/authorize

            HTTP请求方式
            GET/POST

            请求参数
 	            必选	类型及范围	说明
            client_id	true	string	申请应用时分配的AppKey。
            redirect_uri	true	string	授权回调地址，传的值需与自己在开放平台网站填写的回调地址一致，设置填写位置：“我的应用>应用信息>高级信息”。
            scope	false	string	申请scope权限所需参数，可一次申请多个scope权限，用逗号分隔。使用文档
            state	false	string	用于保持请求和回调的状态，在回调时，会在Query Parameter中回传该参数。开发者可以用这个参数验证请求有效性，也可以记录用户请求授权页前的位置。这个参数可用于防止跨站请求伪造（CSRF）攻击
            display	false	string	授权页面的终端类型，取值见下面的说明。
            forcelogin	false	boolean	是否强制用户重新登录，true：是，false：否。默认false。
            language	false	string	授权页语言，缺省为中文简体版，en为英文版。英文版测试中，开发者任何意见可反馈至 @微博API


            display说明：
            参数取值	类型说明
            default	默认的授权页面，适用于web浏览器。
            mobile	移动终端的授权页面，适用于支持html5的手机。注：使用此版授权页请用 https://open.weibo.cn/oauth2/authorize 授权接口
            wap	wap版授权页面，适用于非智能手机。
            client	客户端版本授权页面，适用于PC桌面应用。
            apponweibo	默认的站内应用授权页，授权后不返回access_token，只刷新站内应用父框架。
            返回数据
            返回值字段	字段类型	字段说明
            code	string	用于第二步调用oauth2/access_token接口，获取授权后的access token。
            state	string	如果传递参数，会回传该参数。
            示例
            //请求
            https://api.weibo.com/oauth2/authorize?client_id=123050457758183&redirect_uri=http://www.example.com/response&response_type=code

            //同意授权后会重定向
            http://www.example.com/response&code=CODE
            */
            string param = string.Format("/oauth2/authorize?response_type=code&client_id={0}&redirect_uri={1}&forcelogin={2}", client_id, HttpUtility.UrlEncode(redirect_uri), forcelogin);
            if(!string.IsNullOrWhiteSpace(state))
            {
                param += string.Format("&state={0}", state);
            }
            if (!string.IsNullOrWhiteSpace(scope))
            {
                param += string.Format("&scope={0}", scope);
            }
            if (!string.IsNullOrWhiteSpace(display))
            {
                param += string.Format("&display={0}", display);
            }
            if (!string.IsNullOrWhiteSpace(language))
            {
                param += string.Format("&language={0}", language);
            }
            return CommonConfig.WebApiUrl_WeiBo + param;
        }

        /// <summary>
        /// 根据用户ID获取用户信息
        /// https://open.weibo.com/wiki/2/users/show
        /// </summary>
        /// <param name="access_token">采用OAuth授权方式为必填参数，OAuth授权后获得。</param>
        /// <param name="uid">需要查询的用户ID。参数uid与screen_name二者必选其一，且只能选其一；</param>
        /// <param name="screen_name">需要查询的用户昵称。参数uid与screen_name二者必选其一，且只能选其一；</param>
        /// <returns></returns>
        public static ReturnData GetUserInfo(string access_token, string uid = "", string screen_name = "")
        {
            string param = string.Format("?access_token={0}", access_token);
            if (!string.IsNullOrWhiteSpace(uid))
            {
                param = string.Format("&uid={0}", uid);
            }
            if (!string.IsNullOrWhiteSpace(screen_name))
            {
                param = string.Format("&screen_name={0}", screen_name);
            }
            string reqUrl = CommonConfig.WebApiUrl_WeiBo + "/2/users/show.json" + param;
            return HttpHelper.HttpGet(reqUrl);
        }
    }
}
